알고리즘 Tips

@VERO
Created Date · 2023년 08월 30일 08:08
Last Updated Date · 2023년 11월 09일 05:11

그래프

이진 트리 순회 문제

  • 후위 순회의 끝은 root 이다.
  • 중위 순회와 후위 순회 입력 받아 전위 순회 구하기
import sys

sys.setrecursionlimit(int(1e5))


def find_tree(in_start, in_end, post_start, post_end):
    if in_start > in_end or post_start > post_end:
        return
    root = post_order[post_end]
    print(root, end=' ')
    root_index = in_order_index[root]
    left_size = in_order_index[root] - in_start
    find_tree(in_start, root_index - 1, post_start, post_start + left_size - 1)
    find_tree(root_index + 1, in_end, post_start + left_size, post_end - 1)


n = int(input())
in_order = list(map(int, input().split()))
post_order = list(map(int, input().split()))
in_order_index = [0] * (n + 1)
for i in range(n):
    in_order_index[in_order[i]] = i
find_tree(0, n - 1, 0, n - 1)

분리 집합

  • 사이클 찾기
    • x와 y 를 union 하려고 하는데, 이미 x와 y 의 부모가 같은 경우 사이클이 존재한다고 할 수 있다.
def is_cycle(x, y):
	return find(x) == find(y)

for i in range(m):  
	a, b = map(int, input().split()) 
	if is_cycle(a, b): 
		# 사이클이 존재한다.